﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Biciq.Datos;
using System.ServiceModel.DomainServices.Client;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Browser;
namespace Biciq.Silverlight.UI
{
    public class FacturacionVistaModelo:VistaModeloBase
    {
        #region Contructores
        /// <summary>
        /// Metodo que muestra la vista de facturación.
        /// </summary>
        /// <param name="cliente"></param>
        public FacturacionVistaModelo(Cliente cliente)
        {
            InicializarMensajesError();

            MostrarRubro = Visibility.Visible;
            MostrarTipoSuscripcion = Visibility.Collapsed;

            ListaTipoSuscripcion = CacheCliente.ListaTipoSuscripcion;
            ListaFormaPago = CacheCliente.ListaFormaPago;
            _formaPagoSeleccionado = ListaFormaPago.Where(f => f.Nombre == "Efectivo").FirstOrDefault();
            _clienteSeleccionado = cliente;
            TipoSuscripcionSeleccionado = ListaTipoSuscripcion.Where(t => t.Id == ClienteSeleccionado.TipoSuscripcionId).FirstOrDefault();
            Facturado = !ClienteSeleccionado.Promocion.Value;
        }
        public FacturacionVistaModelo(Cliente cliente, bool reimpresionTarjeta)
        {
            ReimpresionTarjeta = reimpresionTarjeta;

            MostrarRubro = Visibility.Visible;
            MostrarTipoSuscripcion = Visibility.Collapsed;

            InicializarMensajesError();
            ListaTipoSuscripcion = CacheCliente.ListaTipoSuscripcion;
            ListaFormaPago = CacheCliente.ListaFormaPago;
            _formaPagoSeleccionado = ListaFormaPago.Where(f => f.Nombre == "Efectivo").FirstOrDefault();
            _clienteSeleccionado = cliente;
            TipoSuscripcionSeleccionado = ListaTipoSuscripcion.Where(t => t.Id == ClienteSeleccionado.TipoSuscripcionId).FirstOrDefault();

            //Facturado = !ClienteSeleccionado.Promocion.Value;

          
        }

        #endregion

        #region Campos
        private Cliente _clienteSeleccionado;
        private decimal _total;
        private decimal _iva;
        private decimal subtotal;
        private List<TipoSuscripcion> _listaTipoSuscripcion;
        private List<FormaPago> _listaFormaPago;
        private DateTime _fechaCaducidad;
        private TipoSuscripcion _tipoSuscripcionSeleccionado;
        private string _numeroTarjeta;
        private FormaPago _formaPagoSeleccionado;
        private GenerarTarjetaVistaModelo _generarTarjetaVistaModelo;
        private GenerarTarjetaVista _generarTarjetaVista;
        private string _numeroDocumento;

        public string NumeroDocumento
        {
            get { return _numeroDocumento; }
            set {
                _numeroDocumento = value;
                RaisePropertyChanged("NumeroDocumento");
            }
        }
        private bool _facturado;

        public bool Facturado
        {
            get { return _facturado; }
            set 
            { 
                _facturado = value;
                RaisePropertyChanged("Facturado");
            
            }
        }
        

        private string _numeroBaucher;

       
        private string _Banco;

        public string Banco
        {
            get { return _Banco; }
            set 
            { 
                _Banco = value;
                RaisePropertyChanged("Banco");
            }
        }

        private bool _reimpresionTarjeta;

        private Visibility _mostrarTipoSuscripcion;


        private Visibility _mostrarRubro;

       


        



        #endregion

        #region Propiedades

        public Visibility MostrarRubro
        {
            get { return _mostrarRubro; }
            set 
            {
                _mostrarRubro = value;
                RaisePropertyChanged("MostrarRubro");
            }
        }


        public Visibility MostrarTipoSuscripcion
        {
            get { return _mostrarTipoSuscripcion; }
            set
            {
                _mostrarTipoSuscripcion = value;
                RaisePropertyChanged("MostrarTipoSuscripcion");
            }
        }


        public bool ReimpresionTarjeta
        {
            get { return _reimpresionTarjeta; }
            set 
            {
                _reimpresionTarjeta = value;
                RaisePropertyChanged("ReimpresionTarjeta");
            }
        }

        public FormaPago FormaPagoSeleccionado
        {
            get { return _formaPagoSeleccionado; }
            set 
            {
                _formaPagoSeleccionado = value;
                RaisePropertyChanged("FormaPagoSeleccionado");
            }
        }

        public string NumeroBaucher
        {
            get { return _numeroBaucher; }
            set 
            {
                _numeroBaucher = value;
                RaisePropertyChanged("NumeroBaucher");
            }
        }
        public string NumeroTarjeta
        {
            get { return _numeroTarjeta; }
            set 
            {
                _numeroTarjeta = value;
                RaisePropertyChanged("NumeroTarjeta");
            }
        }
        public List<FormaPago> ListaFormaPago
        {
            get { return _listaFormaPago; }
            set 
            { 
                _listaFormaPago = value;
                RaisePropertyChanged("ListaFormaPago");
            }
        }

        public decimal Subtotal
        {
            get { return subtotal; }
            set 
            { 
                subtotal = value;
                RaisePropertyChanged("Subtotal");
            }
        }
        public decimal Iva
        {
            get { return _iva; }
            set 
            { 
                _iva = value;
                RaisePropertyChanged("Iva");
            }
        }
        public DateTime FechaCaducidad
        {
            get { return _fechaCaducidad; }
            set
            {
                _fechaCaducidad = value;
                RaisePropertyChanged("FechaCaducidad");
            }
        }
        public List<TipoSuscripcion> ListaTipoSuscripcion
        {
            get { return _listaTipoSuscripcion; }
            set
            {
                _listaTipoSuscripcion = value;
                RaisePropertyChanged("ListaTipoSuscripcion");
            }
        }
        public TipoSuscripcion TipoSuscripcionSeleccionado
        {
            get { return _tipoSuscripcionSeleccionado; }
            set
            {
                _tipoSuscripcionSeleccionado = value;
                RaisePropertyChanged("TipoSuscripcionSeleccionado");
                if (TipoSuscripcionSeleccionado != null)
                {
                    BiciqContexto.ObtenerValorSuscripcionPorTipo(TipoSuscripcionSeleccionado.Id).Completed += (o, ev) =>
                    {
                        if (!ReimpresionTarjeta)
                        {
                            Total = ((InvokeOperation<decimal>)o).Value;
                            Subtotal = Math.Round(Total / (decimal)1.12, 2);
                            Iva = Math.Round(Total - Subtotal, 2);
                        }
                        else
                        {
                            Total = Convert.ToDecimal(CacheCliente.ListaParametros.Where(p => p.Nombre == "Costo Tarjeta").FirstOrDefault().Valor);
                            Subtotal = Math.Round(Total / (decimal)1.12, 2);
                            Iva = Math.Round(Total - Subtotal, 2);
                        }

                        if (TipoSuscripcionSeleccionado.Id == Guid.Parse( "89b84081-c2a6-4b15-99d1-37fd23968ab0"))
                        {
                            FechaCaducidad = DateTime.Now.AddDays(31);
                        }
                        else
                        {
                            FechaCaducidad = DateTime.Now.AddDays(365);

                        }
                        ClienteSeleccionado.TipoSuscripcionId = TipoSuscripcionSeleccionado.Id;
                        Procesando = false;
                    };
                }
            }
        }
     
        public decimal Total
        {
            get { return _total; }
            set 
            { 
                _total = value; 
                RaisePropertyChanged("Total");
            }
        }
        public Cliente ClienteSeleccionado
        {
            get { return _clienteSeleccionado; }
            set
            { 
                _clienteSeleccionado = value;
                RaisePropertyChanged("ClienteSeleccionado");
                TipoSuscripcionSeleccionado = ListaTipoSuscripcion.Where(t => t.Id == _clienteSeleccionado.TipoSuscripcionId).FirstOrDefault();
            }
        }

        public override void Guardar()
        {
            InicializarMensajesError();
            if (FormaPagoSeleccionado == null)
            {
                AgregarMensajeError("Debe seleccionar una Forma de Pago");
                MostrarErrores = Visibility.Visible;
                return;
            }

            
                ClienteSeleccionado.Estado = "Activo";

                if (ClienteSeleccionado.FechaActivacion == null)
                {
                    ClienteSeleccionado.FechaActivacion = DateTime.Now;
                    ClienteSeleccionado.CaducidadSuscripcion = DateTime.Now.AddDays(365);
                }

            
            Factura factura = new Factura();

            factura.Fecha = DateTime.Now;
            factura.IdCliente = ClienteSeleccionado.Id;
            factura.IdFormaPago = FormaPagoSeleccionado.Id;
            factura.IdTipoSuscripcion = TipoSuscripcionSeleccionado.Id;
            factura.IdUsuario = CacheCliente.UsuarioLogueado.id;
            factura.Iva = Iva;
            factura.SubTotal = Subtotal;
            factura.Total = Total;
            factura.Id = Guid.NewGuid();
            factura.Facturado = Facturado;
            factura.NumeroDocumento = NumeroDocumento;
            BiciqContexto.Facturas.Add(factura);
            BiciqContexto.SubmitChanges().Completed += delegate
            {
                LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar("La factura se ha generado con éxito", "Facturación Exitosa", LogicStudio.Framework.UI.Utilidades.TipoVentana.Ok);
                GenerarTarjeta();
            };

        }
        private void GenerarTarjeta()
        {

            _generarTarjetaVista = new GenerarTarjetaVista();
            if (ReimpresionTarjeta)
            {
                _generarTarjetaVistaModelo = new GenerarTarjetaVistaModelo(ClienteSeleccionado, Visibility.Visible, true);
            }
            else
            {
                _generarTarjetaVistaModelo = new GenerarTarjetaVistaModelo(ClienteSeleccionado, Visibility.Collapsed);
            }
            _generarTarjetaVista.DataContext = _generarTarjetaVistaModelo;

            _generarTarjetaVistaModelo.EventoCerrarEditor += delegate
            {
                UsuariosPermanentesVista vista = new UsuariosPermanentesVista();
                UsuariosPermanentesVistaModelo vistaModelo = new UsuariosPermanentesVistaModelo();
                vista.DataContext = vistaModelo;
                var Principal = (PrincipalVista)Application.Current.RootVisual;
                Principal.LimpiarCanvas();
                Principal.canvasBody.Content = vista;
                Procesando = false;
                _generarTarjetaVista.Close();
            };

            _generarTarjetaVista.Show();

        }
        public override void Cancelar()
        {

            Action aceptar;
            aceptar = CancelarFacturacion;
            string titulo = string.Format("Cancelar Facturación");
            LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar("Si cancela la Facturación el Cliente regresará a estado Registrado, desea Continuar?", titulo, LogicStudio.Framework.UI.Utilidades.TipoVentana.Confirmar, aceptar);

        }

        private void CancelarFacturacion()
        {
            Procesando = true;
            //if (!ReimpresionTarjeta)
            //{
            //    ClienteSeleccionado.Estado = "PendientePago";
            //    BiciqContexto.SubmitChanges().Completed += delegate
            //    {

            //        UsuariosPermanentesVista vista = new UsuariosPermanentesVista();
            //        UsuariosPermanentesVistaModelo vistaModelo = new UsuariosPermanentesVistaModelo();
            //        vista.DataContext = vistaModelo;
            //        var Principal = (PrincipalVista)Application.Current.RootVisual;
            //        Principal.LimpiarCanvas();
            //        Principal.canvasBody.Content = vista;
            //        Procesando = false;
            //    };
            //}
            //else
            //{
            BiciqContexto.RejectChanges();
                UsuariosPermanentesVista vista = new UsuariosPermanentesVista();
                UsuariosPermanentesVistaModelo vistaModelo = new UsuariosPermanentesVistaModelo();
                vista.DataContext = vistaModelo;
                var Principal = (PrincipalVista)Application.Current.RootVisual;
                Principal.LimpiarCanvas();
                Principal.canvasBody.Content = vista;
                Procesando = false;
            //}
        }

        #endregion
    }
}
